home *** CD-ROM | disk | FTP | other *** search
/ Celestin Apprentice 5 / Apprentice-Release5.iso / Demos / A.D. Software / OOFILE / PhoneControl OOFILE sample / Source / CMainWindow.cp < prev    next >
Text File  |  1996-03-28  |  8KB  |  355 lines

  1. // CMainWindow.cp -- window methods
  2. // Created 01/01/95 12:01 PM by AppMaker
  3.  
  4. #include "CMainWindow.h"
  5. #include "PhoneControl_OOFILE.h"
  6.  
  7. #include <UReanimator.h>
  8. #include <LStream.h>
  9. #include <LListBox.h>
  10. #include <LStdControl.h>
  11. #include <LTabGroup.h>
  12. #include <LEditField.h>
  13. #include <LString.h>
  14. #include <UDesktop.h>
  15. #include <PP_KeyCodes.h>
  16. #include <PP_Messages.h>
  17. #include "LStrTableView.h"
  18. #include <LTableMonoGeometry.h>
  19. #include <LTableMultiSelector.h>
  20.  
  21. #include "stSetCursor.h"
  22.  
  23. #define PPob_MainWindowID    200
  24. #define RidL_MainWindowID    200
  25.  
  26.  
  27.  
  28. //----------
  29. //    This is the function you register with URegistrar to create a
  30. //    CMainWindow from a resource
  31.  
  32. CMainWindow*
  33. CMainWindow::CreateMainWindowStream(
  34.     LStream    *inStream)
  35. {
  36.     return (new CMainWindow(inStream));
  37. }
  38.  
  39. //----------
  40. CMainWindow::CMainWindow()
  41. {
  42. }
  43.  
  44. //----------
  45. CMainWindow::CMainWindow(
  46.     LStream    *inStream)
  47.         : LWindow(inStream)
  48. {
  49. }
  50.  
  51. //----------
  52. CMainWindow::~CMainWindow()
  53. {
  54. }
  55.  
  56. //----------
  57. //    This member function gets called once the containment hierarchy that contains
  58. //    this pane has been built. It gives us a chance to get data members for
  59. //    interesting subviews, and to do other operations now that our subviews exist.
  60. void
  61. CMainWindow::FinishCreateSelf()
  62. {
  63.     mMainList = (LStrTableView *)FindPaneByID('Main');
  64.     mFindButton = (LStdButton *)FindPaneByID('Fine');
  65.     mFindField = (LControlEnablingEditField *)FindPaneByID('Edit');
  66.     mLastNameButton = (LStdButton *)FindPaneByID('Lase');
  67.     mFirstNameButton = (LStdButton *)FindPaneByID('Fire');
  68.     mExtnButton = (LStdButton *)FindPaneByID('Extn');
  69.     mPagerButton = (LStdButton *)FindPaneByID('Pagr');
  70.     mDepartmentButton = (LStdButton *)FindPaneByID('Dept');
  71.     mTitleButton = (LStdButton *)FindPaneByID('Tite');
  72.     mShowAllButton = (LStdButton *)FindPaneByID('Shol');
  73.  
  74.     LTabGroup    *tabGroup = new LTabGroup(this);
  75.     mFindField->SetSuperCommander(tabGroup);    // becomes the active field
  76.  
  77.     UReanimator::LinkListenerToControls(this, this, RidL_MainWindowID);
  78.         // the purpose is to "connect" self to whatever controls
  79.         // that we want to "listen" to
  80.  
  81.     mMainList->AddListener(this);  // LStrTableView can't be included in RidL
  82.     
  83. // any additional initialization for your window:
  84.     mFindButton->Disable();
  85.     mShowAllButton->Disable();
  86.     mFindField->enablesControl(mFindButton);
  87.     mCurrentSortButton = mLastNameButton;
  88.     new LDefaultOutline(mFindButton);
  89.     mMainList->SetTableGeometry(new LTableMonoGeometry(mMainList, 104 /* width */, 11));
  90.     mMainList->SetTableSelector(new LTableMultiSelector(mMainList));
  91. }
  92.  
  93.  
  94. //----------
  95. void
  96. CMainWindow::DoFind()
  97. {
  98. // bit of a hack, if length is zero, select all records
  99. // that lets us call this routine after changing sort order
  100. // so we preserve the effect of the sort
  101.     stSetCursor showWatch;
  102.     
  103.     Str255 fieldContents;
  104.     mFindField->GetDescriptor(fieldContents);
  105.     if (fieldContents[0]=='\0')
  106.         mPhoneControl->selectAll();
  107.     else {
  108.         p2cstr(fieldContents);
  109. // 96/03/27 realised don't need to sort as always searching on indexed field
  110.         mPhoneControl->unSorted();
  111.         mPhoneControl->search(mCurrentSortField->startsWith((char*)fieldContents));
  112.     }
  113.     mFindField->SelectAll();  // so overtyping will clear
  114.     RefreshBrowser();
  115.     mShowAllButton->Enable();
  116. }
  117.  
  118. //----------
  119. void
  120. CMainWindow::DoByLastName()
  121. {
  122.     ChangeSortTo(mLastNameButton, mPhoneControl->LastName);
  123. }
  124.  
  125. //----------
  126. void
  127. CMainWindow::DoByFirstName()
  128. {
  129.     ChangeSortTo(mFirstNameButton, mPhoneControl->FirstName);
  130. }
  131.  
  132. //----------
  133. void
  134. CMainWindow::DoByExtn()
  135. {
  136.     ChangeSortTo(mExtnButton, mPhoneControl->Extn);
  137. }
  138.  
  139. //----------
  140. void
  141. CMainWindow::DoByPager()
  142. {
  143.     ChangeSortTo(mPagerButton, mPhoneControl->Pager);
  144. }
  145.  
  146. //----------
  147. void
  148. CMainWindow::DoByDepartment()
  149. {
  150.     ChangeSortTo(mDepartmentButton, mPhoneControl->Department);
  151. }
  152.  
  153. //----------
  154. void
  155. CMainWindow::DoByTitle()
  156. {
  157.     ChangeSortTo(mTitleButton, mPhoneControl->Title);
  158. }
  159.  
  160. void
  161. CMainWindow::ChangeSortTo(LStdButton* newSortBtn, dbChar& sortField)
  162. {
  163.     Str255 newSortTitle;
  164.     mCurrentSortButton = newSortBtn;
  165.     newSortBtn->GetDescriptor(newSortTitle);
  166.     LStr255 newTitle(newSortTitle);
  167.     newTitle.Insert("Find ", 5, 0);
  168.     mFindButton->SetDescriptor(newTitle);    
  169.  
  170.     mCurrentSortField = &sortField;
  171.     DoShowAll();
  172. }
  173.  
  174. //----------
  175. void
  176. CMainWindow::DoShowAll()
  177. {
  178. // only enabled if restricted the list
  179.  
  180.     stSetCursor showWatch;  // just a watch cursor
  181.  
  182. // 93/06/27 in case we just did a Find, which removed a sort order    
  183.      mPhoneControl->setSortOrder(*mCurrentSortField);
  184.      
  185.     mPhoneControl->selectAll();
  186.     RefreshBrowser();
  187.     mShowAllButton->Disable();
  188. }
  189.  
  190.  
  191. //----------
  192. void
  193. CMainWindow::ListenToMessage(
  194.     MessageT    inMessage,
  195.     void        *ioParam)
  196. {
  197.     switch (inMessage) {
  198.     case 'Find':
  199.             DoFind();
  200.         break;
  201.  
  202.     case 'ByLe':
  203.             DoByLastName();
  204.         break;
  205.  
  206.     case 'ByFe':
  207.             DoByFirstName();
  208.         break;
  209.  
  210.     case 'ByEn':
  211.             DoByExtn();
  212.         break;
  213.  
  214.     case 'ByPr':
  215.             DoByPager();
  216.         break;
  217.  
  218.     case 'ByDt':
  219.             DoByDepartment();
  220.         break;
  221.  
  222.     case 'ByTe':
  223.             DoByTitle();
  224.         break;
  225.  
  226.     case 'Shol':
  227.             DoShowAll();
  228.         break;
  229.  
  230.     default:
  231.     if (!OOFILEhandlesMessage(inMessage, ioParam))
  232.       ; // do something
  233.         break;
  234.     }
  235. }
  236.  
  237. //----------
  238. Boolean
  239. CMainWindow::ObeyCommand(
  240.     CommandT    inCommand,
  241.     void        *ioParam)
  242. {
  243.     Boolean        cmdHandled = true;
  244.  
  245.     switch (inCommand) {
  246.  
  247.     // +++ Add cases here for the commands you handle
  248.     //        Remember to add same cases to FindCommandStatus below
  249.     //        to enable/disable the commands
  250.     default:
  251.     cmdHandled = OOFILEhandlesMessage(inCommand, ioParam);
  252.     if (!cmdHandled)
  253.             cmdHandled = LWindow::ObeyCommand(inCommand, ioParam);
  254.         break;
  255.     }
  256.  
  257.     return cmdHandled;
  258. }
  259.  
  260. //----------
  261. void
  262. CMainWindow::FindCommandStatus(
  263.     CommandT    inCommand,
  264.     Boolean        &outEnabled,
  265.     Boolean        &outUsesMark,
  266.     Char16        &outMark,
  267.     Str255        outName)
  268. {
  269.     outUsesMark = false;
  270.  
  271.     switch (inCommand) {
  272.  
  273.     // +++ Add cases here for the commands you handle
  274.     default:
  275.             LWindow::FindCommandStatus(inCommand, outEnabled,
  276.                                         outUsesMark, outMark, outName);
  277.         break;
  278.     }
  279. }
  280.  
  281. //----------
  282. Boolean
  283. CMainWindow::FocusDraw()
  284. {
  285.     Boolean        focused = LView::FocusDraw();
  286.  
  287.     if (focused) {
  288.         AuxWinHandle    awHndl;
  289.         CTabHandle        awCTable;
  290.         ColorSpec        contentSpec;
  291.  
  292.         GetAuxWin(GetMacPort(), &awHndl);
  293.         awCTable = (**awHndl).awCTable;
  294.         contentSpec = (**awCTable).ctTable [wContentColor];        // should search vs. index
  295.         ::RGBBackColor(&contentSpec.rgb);
  296.     }
  297.  
  298.     return focused;
  299. }
  300.  
  301.  
  302. void CMainWindow::SetDatabase(CdbPhoneControl* inPhoneControl)
  303. {
  304. // our copy of the database, if we need to change its state in our Do methods
  305.     mPhoneControl = inPhoneControl;    
  306.  
  307. // link view to controls created in FinishCreateSelf
  308.     dbView* theView = new dbView(inPhoneControl);
  309.     *theView  << inPhoneControl->LastName  << inPhoneControl->FirstName << inPhoneControl->Title << inPhoneControl->Extn << inPhoneControl->Department << inPhoneControl->Pager ;
  310.     AdoptView(theView);
  311.     BrowseViewWithTable(mMainList);  
  312.     inPhoneControl->setSortOrder(inPhoneControl->LastName);
  313.     mCurrentSortField = &(mPhoneControl->LastName);
  314. }
  315.  
  316.  
  317. Boolean
  318. CMainWindow::HandleKeyPress(
  319.     const EventRecord    &inKeyEvent)
  320. {
  321.     Boolean        keyHandled = false;
  322.     
  323.     switch (inKeyEvent.message & charCodeMask) {
  324.     
  325.         case char_Enter:
  326.         case char_Return:
  327.             mFindButton->SimulateHotSpotClick(kControlButtonPart);
  328.             keyHandled = true;
  329.             break;
  330.             
  331.         default:
  332.             keyHandled = LWindow::HandleKeyPress(inKeyEvent);
  333.             break;
  334.     }    
  335.     return keyHandled;
  336. }
  337.  
  338.  
  339. // lightweight class to wrap creating CMainWindow
  340.  
  341. LWindow* CMainWindowFactory::makeWindow(const bool loadData) const
  342. {
  343.     stSetCursor showWatch;
  344.     
  345.     CdbPhoneControl* realTable = (CdbPhoneControl*) mTable;  // safe downcast
  346.        // would later use dynamic_cast to test the above
  347.     CMainWindow *win = (CMainWindow *)LWindow::CreateWindow(PPob_MainWindowID, mCommander);
  348.     win->SetDatabase(realTable);
  349.     if (loadData)
  350.         win->LoadBrowseData();
  351.     return (LWindow*) win;
  352. }
  353.  
  354.  
  355.